﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace ServidorGestionClientes
{
    public partial class MenuPrincipal : Form
    {
        public MenuPrincipal()
        {
            InitializeComponent();
            try
            {
                Sistema.GetInstancia();
            }
            catch (Exception)
            {

                MessageBox.Show("Hay un error al iniciar el Remoting o el MSMQ, por favor verifique la configuración y vuelva a correrlo.", "ERROR", MessageBoxButtons.OK,MessageBoxIcon.Error);
            }
        }

        private void btnFactura_Click(object sender, EventArgs e)
        {
            if (cbClientes.SelectedItem != null)
            {
                tabFactConsumos.Rows.Clear();
                Cliente cliSelecc = (Cliente)cbClientes.SelectedItem;
                if (cliSelecc.EsPosPago)
                {
                    lbSaldo.Text = "Saldo a pagar:";
                }
                else
                {
                    lbSaldo.Text = "Saldo Disponible :";
                }
                txFacturaNom.Text = cliSelecc.Nombre;
                txFactTotRec.Text = cliSelecc.TotalConsumido();
                txFactCont.Text = cliSelecc.Contrasenia;
                txFactSaldo.Text = "$ " + cliSelecc.Saldo.ToString();
                foreach (Consumo c in cliSelecc.ListaDeConsumos())
                {
                    string[] datos = c.ToString().Split('@');
                    tabFactConsumos.Rows.Add(datos);
                }
                txtPosicion.Text = "[ " + cliSelecc.PosicionAuto.Item1 + ", " + cliSelecc.PosicionAuto.Item2 + "]";
            }
            else
            {
                MessageBox.Show("Debe elegir un cliente.", "ERROR");
            }
        }

        private void Actualizar()
        {
            cbCliente.Items.Clear();
            cbClientes.Items.Clear();
            listUsuarios.Items.Clear();
            cbCliente.Items.AddRange(Sistema.GetInstancia().ListaClientesPrePagos().ToArray());
            cbClientes.Items.AddRange(Sistema.GetInstancia().ListaClientes.ToArray());
            listUsuarios.Items.AddRange(Sistema.GetInstancia().ListaClientes.ToArray());
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            if (texCon.Text.Equals("") || texNom.Text.Equals("") )
            {
                MessageBox.Show("Dejo uno de los campos vacios", "ERROR");
            }
            else if (Sistema.GetInstancia().ExisteCliente(texNom.Text))
            {
                MessageBox.Show("El nombre del cliente ya existe.", "ERROR");
                texNom.Text = "";
            }
            else
            {
                Sistema.GetInstancia().AgregarCliente(texNom.Text, texCon.Text, rbPosPago.Checked);
                MessageBox.Show("El cliente " + texNom.Text + " se ingreso con exito.", "Cliente Ingresado");
                Actualizar();
                texCon.Text = "";
                texNom.Text = "";
            }
        }

        private void btnModificar_Click(object sender, EventArgs e)
        {
            if (listUsuarios.SelectedItem != null)
            {
                if (texNom.Text.Equals("") || texNom.Text.Equals(""))
                {
                    MessageBox.Show("Dejo uno de los campos vacios", "ERROR");
                }
                else
                {
                    string nomViejoCli = ((Cliente)listUsuarios.SelectedItem).Nombre;
                    if (texNom.Text.Equals(nomViejoCli) || !Sistema.GetInstancia().ExisteCliente(texNom.Text))
                    {
                        Sistema.GetInstancia().ModificarCliente(nomViejoCli, texNom.Text, texCon.Text, rbPosPago.Checked);
                        MessageBox.Show("El cliente " + texNom.Text + " se modifico con exito.", "Cliente Modificado");
                        Actualizar();
                        texCon.Text = "";
                        texNom.Text = "";
                    }
                    else
                    {
                        MessageBox.Show("El cliente " + texNom.Text + " ya existe, por favor infrese uno nuevo.", "Error");
                    }
                }
            }
            else
            {
                MessageBox.Show("Seleccione un cliente de la lista.", "ERROR");
            }
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {

            if (listUsuarios.SelectedItem != null)
            {
                string nomCliente = listUsuarios.SelectedItem.ToString();
                Sistema.GetInstancia().EliminarCliente(nomCliente);
                MessageBox.Show("El cliente " + nomCliente + " se elimino con exito.", "Cliente Eliminado");
                Actualizar();
            }
            else
            {
                MessageBox.Show("Debe elegir un cliente.", "ERROR");
            }
        }

        private void btnIngreMonto_Click(object sender, EventArgs e)
        {
            if (cbCliente.SelectedItem != null)
            {
                try
                {
                    long montoASumar = long.Parse(txtMonto.Text);
                    Sistema.GetInstancia().AgregarSaldo((Cliente)cbCliente.SelectedItem, montoASumar);
                    int pos = cbCliente.SelectedIndex;
                    MessageBox.Show("Monto ingresado con exito.", "Monto Ingresado");
                    Actualizar();
                    cbCliente.SelectedIndex = pos;
                    txtMonto.Text = "";
                    txtSaldo.Text = "$ " +((Cliente)cbCliente.SelectedItem).Saldo.ToString();
                }
                catch (FormatException)
                {
                    MessageBox.Show("Formato de valor incorrecto.", "ERROR");
                    txtMonto.Text = "";
                }
            }
            else
            {
                MessageBox.Show("Debe elegir un cliente.", "ERROR");
            }
        }

        private void listUsuarios_SelectedIndexChanged(object sender, EventArgs e)
        {
            texCon.Text = ((Cliente)listUsuarios.SelectedItem).Contrasenia;
            texNom.Text = ((Cliente)listUsuarios.SelectedItem).Nombre;
            if (((Cliente)listUsuarios.SelectedItem).EsPosPago)
            {
                rbPosPago.Checked = true;
            }
            else
            {
                rbPrePago.Checked = true;
            }
        }

        private void cbCliente_SelectedIndexChanged(object sender, EventArgs e)
        {
            txtSaldo.Text = "$" + ((Cliente)cbCliente.SelectedItem).Saldo.ToString();
        }

        private void btnDatPru_Click(object sender, EventArgs e)
        {
            Cliente cliente1 = new Cliente("juan", "1234", false);
            cliente1.RecargarSaldo(1000);
            cliente1.AgregarConsumo(5, 54,DateTime.Parse("15/06/2012 08:33:38 a.m."));
            cliente1.AgregarConsumo(2, 20, DateTime.Parse("15/06/2012 10:33:38 a.m."));
            cliente1.AgregarConsumo(5, 54, DateTime.Parse("16/06/2012 09:08:38 a.m."));
            cliente1.AgregarConsumo(5, 54, DateTime.Parse("16/06/2012 08:33:00 a.m."));
            cliente1.AgregarConsumo(5, 54, DateTime.Parse("17/06/2012 08:33:50 a.m."));
            cliente1.AgregarConsumo(5, 54, DateTime.Parse("17/06/2012 05:20:18 p.m."));
            cliente1.ActualizarPosicion(24, 10);
            Sistema.GetInstancia().ListaClientes.Add(cliente1);
            Cliente cliente2 = new Cliente("Pepe", "1111", false);
            cliente2.AgregarConsumo(5, 54, DateTime.Parse("14/06/2012 08:50:00 a.m."));
            cliente2.AgregarConsumo(5, 54, DateTime.Parse("16/06/2012 01:01:50 p.m."));
            Sistema.GetInstancia().ListaClientes.Add(cliente2);
            Cliente cliente3 = new Cliente("Pablo", "123", false);
            cliente3.ActualizarPosicion(100, 100);
            Sistema.GetInstancia().ListaClientes.Add(cliente3);
            Cliente cliente4 = new Cliente("Carlos", "1111", true);
            cliente4.ActualizarPosicion(2, 12);
            cliente4.DescontarSaldo(50);
            Sistema.GetInstancia().ListaClientes.Add(cliente4);
            Cliente cliente5 = new Cliente("Sofia", "1111", true);
            cliente5.AgregarConsumo(5, 54, DateTime.Parse("14/06/2012 08:50:00 a.m."));
            cliente5.AgregarConsumo(5, 54, DateTime.Parse("15/06/2012 03:01:50 p.m."));
            cliente5.ActualizarPosicion(54, 102);
            cliente5.DescontarSaldo(108);
            Sistema.GetInstancia().ListaClientes.Add(cliente5);
            Actualizar();
            MessageBox.Show("Se han ingresado los casos de prueba con exito!", "Casos de prueba ingresados");
        }


    }
}
